К данному примеру относитесь очень осторожно :-). Я вынес его в отдельный файл, чтобы показать и потом вставить в сервер. Но разбор выражения хотя и сделан на рекурсивной основе далеко не идеален. Но это и не нужно в данный момент. Нам просто из запроса нужно выделить имя файла для чтения и это он делает. Хотя может в каких то случаях и ошибиться. Пишите свои замечания и комментарии. Вот код:
// teststr.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "afx.h"
#include "iostream.h"
void GetLine(CString Str);
void Command(CString Str);
void GetCommand(CString Str);
void main()
{
CString s="GET /autor.htm HTTP/1.1\015\012 Accept: application/vnd.ms-excel, */*\015\012\015\012";
GetLine(s);
s="GET / HTTP/1.1\015\012 Accept: application/vnd.ms-excel, */*\015\012\015\012";
GetLine(s);
s="";
GetLine(s);
s="GET\015\012";
GetLine(s);
}
void GetLine(CString Str)
{
CString temp=Str;
int i= Str.Find("\015\012");
int l=Str.GetLength();
Str.Delete(i,l-i);
Command(Str);
temp.Delete(0,i+2);
if (Str.GetLength() !=0)
{
if (temp.GetLength()!=0) GetLine(temp);
}
}
void Command(CString Str)
{
if (Str.Find("GET",0)!=-1) GetCommand(Str);
}
void GetCommand(CString Str)
{
int i=Str.Find("/");
if (i != -1)
{
Str.Delete(0,i+1);
i=Str.Find("HTTP");
int l=Str.GetLength();
Str.Delete(i,l-i);
cout << Str << endl;
}
}
Как видите я привел несколько примеров для того, чтобы убедиться, что он работает. Рекурсивно разбирается вся строка, выделяются строки (CRLF) каждая строка анализируется на наличие GET при его наличии она обрезается с обоих сторон для извлечения имени файла. В следующем шаге я просто вставлю эти функции в виде класса в проект. Меня больше интересует, что сервер выдаст строку по запросу и мы обработаем GET.
Написать свой сервер это одно :-)) и требует тщательного кодирования. А вот понимание принципов работы это другое. Мы занимаемся этим я хочу сказать...